#include "HX711.h"
#include "esp_log.h"
// #include <math.h>



uint32_t ref_num=0;
uint32_t calibration=1;
extern uint32_t pressureHX711BaseLine;


void HX711_init(){
    gpio_config_t io_conf;

    io_conf.intr_type = GPIO_INTR_DISABLE;   // 不使用中断
    io_conf.pin_bit_mask = (1ULL << HX711_SCK_PIN);  // 设置引脚 0
    io_conf.mode = GPIO_MODE_OUTPUT;         // 设置为输出模式
    io_conf.pull_up_en = GPIO_PULLUP_DISABLE; // 不启用上拉
    io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE; // 不启用下拉
    gpio_config(&io_conf);                   // 配置引脚
    
    gpio_set_level(HX711_SCK_PIN, 1);  // 设置为高电平


    // 配置 HX711_DOUT 引脚（GPIO 1）为输入，并启用上拉
    io_conf.pin_bit_mask = (1ULL << HX711_DOUT_PIN);  // 设置引脚 1
    io_conf.mode = GPIO_MODE_INPUT;        // 设置为输入模式
    io_conf.pull_up_en = GPIO_PULLUP_ENABLE; // 启用上拉
    io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE; // 不启用下拉
    gpio_config(&io_conf);                // 配置引脚
    
    delay_ms(100);
    ref_num=HX711_Read(0);


    // 此处可以添加 HX711 读取数据的逻辑
}

uint32_t HX711_Read() {
    uint32_t count = 0; 
    uint8_t i; 
    
    // 将 DOUT 设置为 1
    gpio_set_level(HX711_DOUT_PIN, 1); 
    delay_us(1);

    // 设置 SCK 为 0
    gpio_set_level(HX711_SCK_PIN, 0); 
    
    // 等待 DOUT 为低
    while (gpio_get_level(HX711_DOUT_PIN) == 1); 
    
    // 读取 24 位数据
    for (i = 0; i < 24; i++) { 
        gpio_set_level(HX711_SCK_PIN, 1);   // SCK 上升沿
        count = count << 1;  // 左移一位
        delay_us(1);
        gpio_set_level(HX711_SCK_PIN, 0);   // SCK 下降沿
        if (gpio_get_level(HX711_DOUT_PIN) == 1) { 
            count++; 
        }
        delay_us(1); 
    } 
    
    // 读取完成后，SCK 上升沿
    gpio_set_level(HX711_SCK_PIN, 1); 
    count = count ^ 0x800000;  // 取反，得到 24 位补码
    delay_us(1);
    gpio_set_level(HX711_SCK_PIN, 0);  
    
    return count;  // 返回结果
}

void getPressureHX711BaseLine(){
    pressureHX711BaseLine = HX711_Read();   // 获取初始状态下的HX711传感器数值；
    ESP_LOGI("Yang", "HX711零点值 : %lu", pressureHX711BaseLine);
}

uint16_t getContactPressureAD(){
    // ESP_LOGE("STRAIN","result should be %f",(float)(HX711_Read(i)-ref_num[i])/calibration[i]);
    // return (((float)HX711_Read()-(float)ref_num)/calibration);
    int64_t pressureSensorValue = (int64_t)(HX711_Read()) - (int64_t)(pressureHX711BaseLine) + (1ll << 17) + (1ll << 16);    // 在有符号的情况下，将32位的数据的0位对应到1<<31
    return (uint16_t)(((uint64_t)(pressureSensorValue)) >> 2);          // 接下来对数据进行压缩，应该是将0位置数据压缩到2^15；
    // 传感器读取的值是一个uint32，首先对其进行平移，然后对数据范围进行压缩。
}

uint32_t  getContactPressureUint32T(){
    return HX711_Read();
}


void set_cali(uint32_t num){
    calibration=num;
    ESP_LOGE("STRAIN","calibration is %ld",calibration);
}

void set_zero(){
    ref_num=HX711_Read();

}
void show_cali(){
    ESP_LOGE("STRAIN","calibration is %ld",calibration);
}